package com.jrsoft.jrcore.http

import com.jrsoft.jrcore.util.isContainChinese
import org.json.JSONObject
import retrofit2.Call
import retrofit2.Response

/**
 * 所属系统:  杨梅红画院移动端
 * 所属模块:  基础工具类
 * 功能描述: 网络请求回调工具类
 * 创建时间: 2020/5/19 15:07
 * 维护人:  杨广
 * Copyright @ Jerrisoft 2019. All rights reserved.
 *┌──────────────────────────────────────────────────────────────┐
 *│ 此技术信息为本公司机密信息，未经本公司书面同意禁止向第三方披露．   │
 *│ 版权所有：杰人软件(深圳)有限公司                                │
 *└──────────────────────────────────────────────────────────────┘
 */
abstract class ICallBack<T> : retrofit2.Callback<Result.Response<T>> {

    var errorMessageDefault = "哎呀，找不到信号啦"
    override fun onFailure(call: Call<Result.Response<T>>, t: Throwable) {
        onField(if (t.message?.isContainChinese() == true) t.message else errorMessageDefault)
        onFinally()

    }

    override fun onResponse(call: Call<Result.Response<T>>, response: Response<Result.Response<T>>) {
        if (response.isSuccessful) {
            //Returns true if {@link #code()} is in the range [200..300).
            if (response.body()?.code != null && response.body()?.code != 1L) {
                //业务错误
                onField(if (response.body()?.msg?.isContainChinese() == true) response.body()?.msg else errorMessageDefault)
            } else {
                success()
                response.body()?.data?.let { result ->
                    try {
                        onSuccess(result)
                    } catch (e: Exception) {
                        e.printStackTrace()
                        onField(if (e.message?.isContainChinese() == true) e.message else errorMessageDefault)
                    }
                } ?: onSuccess(null)
            }
        } else {
            response.errorBody()?.string()?.let {
                try {
                    val jsonObject = JSONObject(it)
                    val message = jsonObject.getJSONObject("data").getString("message")
                    onField(if (message.isContainChinese()) message else errorMessageDefault)
                } catch (e: Exception) {
                    e.printStackTrace()
                    onField(errorMessageDefault)
                }
            } ?: onField(errorMessageDefault)
        }
        onFinally()
    }

    /**
     * 请求成功 当返回结果为null时可以重写
     */
    open fun success() {}

    /**
     * 成功时
     */
    abstract fun onSuccess(body: T?)

    /**
     * 失败时
     */
    abstract fun onField(message: String?)

    /**
     * 结束时
     */
    abstract fun onFinally()
}

sealed class Result<T> {
    class Start<T> : Result<T>()
    class Finally<T> : Result<T>()
    data class Response<T>(val data: T?, val code: Long? = null, val msg: String? = null) : Result<T>()
    data class Error<T>(val exceptionMessage: String?) : Result<T>()
}